package com.java.util;

/**
 * 树用泛型来表示，泛型就是即“参数化类型”，就是自定义类型，树那么多名词，叶子啊神马的用泛型定义比较好。
 *
 * @author yunyiqing
 * @param <T>
 */
public class TreeNode<T> {

	T value; // 总节点数

	public TreeNode<T> leftChild;// 左节点
	public TreeNode<T> rightChild;// 右节点

	// 构造器的重载,方便使用
	public TreeNode(T value) {
		this.value = value;
	}

	public TreeNode() {
	}

	/**
	 * 增加左子节点 （左边树干生长）
	 * 
	 * @param value
	 */
	public void addLeft(T value) {
		TreeNode<T> leftChild = new TreeNode<T>(value);
		this.leftChild = leftChild;
	}

	/**
	 * 增加右子节点（右边树干生长）
	 * 
	 * @param value
	 */
	public void addRight(T value) {
		TreeNode<T> rightChild = new TreeNode<T>(value);
		this.rightChild = rightChild;
	}

	/*
	 * 重载equal方法，Object的equal方法默认是两个对象的引用的比较，意思就是指向同一内存,地址则相等，否则不相等；
	 * 如果你现在需要利用对象里面的值来判断是否相等，则重载equal方法
	 */
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		if (!(obj instanceof TreeNode)) {
			return false;
		}
		return this.value.equals(((TreeNode<?>) obj).value);
	}

	/*
	 * 重载hashCode方法，通过hashCode可以很快的查到小内存块。
	 * 通过hashCode比较比equal方法快，当get时先比较hashCode，如果hashCode不同，直接返回false。
	 * 
	 */
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return this.value.hashCode();
	}

	@Override
	public String toString() {
		return this.value == null ? "" : this.value.toString();
	}

}
